package com.lucifer;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * LRU算法的实现
 *
 * @Author yuxiao05@meituan.com
 * @Create 2016-07-11 上午11:45
 */

public class LRU<K,V> {

  private static final float hashLoadFactory = 0.75f;
  private LinkedHashMap<K,V> map;
  private int cacheSize;

  public LRU(int cacheSize) {
    this.cacheSize = cacheSize;
    int capacity = (int)Math.ceil(cacheSize / hashLoadFactory) + 1;
    map = new LinkedHashMap<K,V>(capacity, hashLoadFactory, true){
      private static final long serialVersionUID = 1;

      @Override
      protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > LRU.this.cacheSize;
      }
    };
  }

  public synchronized V get(K key) {
    return map.get(key);
  }

  public synchronized void put(K key, V value) {
    map.put(key, value);
  }

  public synchronized void clear() {
    map.clear();
  }

  public synchronized int usedSize() {
    return map.size();
  }

  public void print() {
    for (Map.Entry<K, V> entry : map.entrySet()) {
      System.out.print(entry.getValue() + "--");
    }
    System.out.println();
  }

  public static void main(String[] args){
    LRU<Integer, String> lru = new LRU<>(3);
    lru.put(1, "first");
    lru.put(2, "second");
    lru.put(3, "third");
    lru.print();
    lru.put(4, "four");
    lru.print();
    lru.put(5, "five");
    lru.get(3);
    lru.print();
    lru.put(4, "second four");
    lru.print();
  }
}
